from django.shortcuts import render
from .models import Game,User,UserToken
from rest_framework import generics
from .serializers import GameSerializer,UserSerializer
from rest_framework import permissions
from django.shortcuts import get_object_or_404
from rest_framework.authentication import BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from .authentication import MyUserBasicAuth,MySessionAuth,MyTokenAuth  # 引入你自己的认证类
from .permissions import IsOwnOrReadOnly  # 引入你自己的权限类
from django.utils import timezone
from datetime import timedelta
# Create your views here.
import time
import hashlib
def get_md5(user):# 根据用户名和当前时间生成一个唯一的 MD5 值，通常用于生成用户的 Token 或者验证码等标识符。
    ctime = str(time.time())
    m = hashlib.md5(bytes(user, encoding='utf-8'))
    m.update(bytes(ctime, encoding='utf-8'))
    return m.hexdigest()

"""
1、要求必须认证才可以实现信息的获取与创建的相关操作

"""
class GameListMD1(generics.ListCreateAPIView):# 执行了创建与获取的相关操作
    queryset = Game.objects.all()
    serializer_class = GameSerializer
    #authentication_classes = [MyUserBasicAuth]
    authentication_classes = [MyTokenAuth]
    """
        作用：定义本接口使用哪种认证方式。
        MyUserBasicAuth 是你自己实现的认证类（通常继承自 BaseAuthentication）。
        它负责 验证请求中提供的用户名和密码是否合法。
        认证成功后，返回 (user, None)，并将 user 设置到 request.user 上，供后续使用。
    """
    permission_classes = [IsAuthenticated]
    """
        作用：要求访问该接口的用户必须已认证（登录）。
        IsAuthenticated 是 DRF 提供的权限类。
        它会检查：request.user.is_authenticated 是否为 True。
        如果不是（即用户未登录），就会返回 HTTP 401 Unauthorized。
    """
    # 重写 创建的时候提供当前登录的用户
    def perform_create(self, serializer):
        # 从请求数据中提取 user_id
        """
        user_id = self.request.data.get("user_id")
        user = get_object_or_404(User, id=user_id)  # 查找用户（你自定义的 User 表）
        serializer.save(user=user)
        """
         # 这里 request.user 是你自定义 User 表中的用户
        serializer.save(user=self.request.user)


class GameList(generics.ListCreateAPIView):# 执行了创建与获取的相关操作
    queryset = Game.objects.all()
    serializer_class = GameSerializer
    authentication_classes = [MyTokenAuth]# 选择认证的方式
    permission_classes = [IsAuthenticated]# 判断用户是否登录
    
    def get_queryset(self):
        # 只返回当前登录用户创建的游戏
        return Game.objects.filter(user=self.request.user)
    # 重写 创建的时候提供当前登录的用户
    def perform_create(self, serializer):
        serializer.save(user=self.request.user)
        

from django.http import JsonResponse
from django.views import View
class GameListView(View):
    def get(self, request):
        return JsonResponse({'message': f'欢迎, {request.user.username}'})



"""
执行游戏类的get、post、put、delete操作
1、问题，如果我必须要求是登录的用户才可以实现查询操作，怎么实现呢？
2、如果当前的信息不是当前用户创建的,那么只有当前用户才可以进行修改和删除操作,怎么实现呢？
"""
class GameDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Game.objects.all()
    serializer_class = GameSerializer
    authentication_classes = [MyTokenAuth]# 选择认证的方式
    permission_classes = [permissions.IsAuthenticated,IsOwnOrReadOnly]


"""
执行游戏类的get、post、put、delete操作
1、问题，如果我必须要求是登录的用户才可以实现查询操作，怎么实现呢？
2、如果当前的信息不是当前用户创建的,那么只有当前用户才可以进行修改和删除操作,怎么实现呢？
"""
class GameDetailD1(generics.RetrieveUpdateDestroyAPIView):
    queryset = Game.objects.all()
    serializer_class = GameSerializer
    authentication_classes = [MyTokenAuth]
    permission_classes = [permissions.IsAuthenticated,IsOwnOrReadOnly]
    """
      权限类	                    未登录用户是否能访问 GET？	                    是否能访问 POST/PUT/DELETE？
        AllowAny	                        ✅ 是	                                        ✅ 是
        IsAuthenticatedOrReadOnly	        ✅ 是	                                         ❌ 否
        IsAuthenticated	                    ❌ 否	                                         ❌ 否  
    """





# views.py
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse

@csrf_exempt
def login_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        try:
            user = User.objects.get(username=username)
            if user.password == password:
                request.session['user_id'] = user.id  # 设置 session
                 # 设置 session 生命周期（比如 1 小时）
                 # request.session.set_expiry(3600)  # 秒数
                 # request.session.set_expiry(0)  # 浏览器关闭即失效
                return JsonResponse({'msg': '登录成功'})
            else:
                return JsonResponse({'msg': '密码错误'}, status=400)
        except User.DoesNotExist:
            return JsonResponse({'msg': '用户不存在'}, status=404)
        


@csrf_exempt
def login_view_session(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        try:
            user = User.objects.get(username=username)
            if user.password == password:
                request.session['user_id'] = user.id  # 设置 session
                 # 设置 session 生命周期（比如 1 小时）
                 # request.session.set_expiry(3600)  # 秒数
                 # request.session.set_expiry(0)  # 浏览器关闭即失效
                return JsonResponse({'msg': '登录成功'})
            else:
                return JsonResponse({'msg': '密码错误'}, status=400)
        except User.DoesNotExist:
            return JsonResponse({'msg': '用户不存在'}, status=404)

        
import json
csrf_exempt
def login_view_token_mysql(request):
    if request.method == 'POST':
        data = json.loads(request.body)
        username = data.get('username')
        password = data.get('password')
        print(username,password)
        try:
            obj = User.objects.filter(username=username, password=password).first()
            if not obj:
                return JsonResponse({'msg': '密码错误'}, status=400)
            token = get_md5(username)
            # 自动更新 create_time
            UserToken.objects.update_or_create(user=obj, defaults={'token': token, 'create_time': timezone.now()})
            return JsonResponse({'msg': '登录成功', 'token': token})
        except User.DoesNotExist:
            return JsonResponse({'msg': '用户不存在'}, status=404)
    # 如果不是 POST 请求，返回错误信息
    return JsonResponse({'msg': '只支持 POST 请求'}, status=405)

from django_redis import get_redis_connection
csrf_exempt
def login_view_token_redis(request):
    if request.method == 'POST':
        data = json.loads(request.body)
        username = data.get('username')
        password = data.get('password')
        print(username,password)
        try:
            obj = User.objects.filter(username=username, password=password).first()
            if not obj:
                return JsonResponse({'msg': '密码错误'}, status=400)
            token = get_md5(username)
            redis_conn = get_redis_connection("default")
            redis_conn.setex(f"token:{token}", timedelta(minutes=1), obj.id)
            return JsonResponse({'msg': '登录成功', 'token': token})
        except User.DoesNotExist:
            return JsonResponse({'msg': '用户不存在'}, status=404)
    # 如果不是 POST 请求，返回错误信息
    return JsonResponse({'msg': '只支持 POST 请求'}, status=405)


def index_html(request):
    return render(request, 'casedemo15/test_game_session.html')

def tokenlogin_index_html(request):
    return render(request, 'casedemo15/tokenlogin.html')













class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer